use anyhow::Result;
use clap::{Parser, Subcommand};

// mycli 在 cargo.toml 中指定生成的 exe 名称
// mycli csv -i input.csv -o output.json --header -d ','

#[derive(Debug, Parser)]
#[command(version, about)] // 这里指定 name 没有意义, 用的是 exe 名称
pub struct Cli {
    #[command(subcommand)]
    pub csv: Cmd,
}

#[derive(Debug, Subcommand)]
pub enum Cmd {
    // 这个可以省略但是没有必要
    //#[command(name = "csv", about = "show or convert csv file")]
    Csv(CsvOpts),
}

#[derive(Debug, Parser)]
pub struct CsvOpts {
    #[arg(short, long, value_parser = verify_input)]
    pub input: String,
    #[arg(short, long, default_value = "output.json")]
    pub output: String,
    #[arg(long, default_value_t = true)]
    pub header: bool,
    #[arg(short, long, default_value_t = ',')]
    pub delemiter: char,
}

fn verify_input(filepath: &str) -> Result<String, String> {
    let filepath = std::path::Path::new(filepath);
    if !filepath.exists() {
        return Err(format!("File not found: {}", filepath.display()));
    }
    Ok(filepath.to_str().unwrap().to_string())
}
